package com.healthcloud.utils;

import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.ui.TextAnchor;

public class JFreeChart {

	/**
	 * 创建柱状图
	 * @param title 图标题
	 * @param xName x轴名称
	 * @param yName y轴名称
	 * @param ds 数据集
	 * @param filePath 文件路径 (例如：d://temp.jpg)
 	 * @throws IOException
	 */
	public static void CreateChart(String title,String xName,String yName,CategoryDataset ds,String filePath) throws IOException{
        org.jfree.chart.JFreeChart chart = ChartFactory.createBarChart(
                title, //图表标题
                xName, //目录轴的显示标签
                yName, //数值轴的显示标签
                ds, //数据集
                PlotOrientation.VERTICAL, //图表方向
                false, //是否显示图例，对于简单的柱状图必须为false
                true, //是否生成提示工具
                false);         //是否生成url链接

        CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
       //设置网格背景颜色
        categoryplot.setBackgroundPaint(Color.white);
        //设置网格竖线颜色
        categoryplot.setDomainGridlinePaint(Color.black);
        //设置网格横线颜色
        categoryplot.setRangeGridlinePaint(Color.black);
      //显示每个柱的数值，并修改该数值的字体属性
        BarRenderer renderer = new BarRenderer();
        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        renderer.setBaseItemLabelsVisible(true);
        //默认的数字显示在柱子中，通过如下两句可调整数字的显示
        //注意：此句很关键，若无此句，那数字的显示会被覆盖，给人数字没有显示出来的问题
        renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
        renderer.setItemLabelAnchorOffset(10D);
        //设置每个地区所包含的平行柱的之间距离
        renderer.setItemMargin(0.4);
        renderer.setSeriesPaint(0, Color.ORANGE);
        renderer.setMaximumBarWidth(0.1);
        renderer.setMinimumBarLength(0.1);
        
        categoryplot.setRenderer(renderer);
        

        NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();

        CategoryAxis domainAxis = categoryplot.getDomainAxis();

        /*------设置X轴坐标上的文字-----------*/
        domainAxis.setTickLabelFont(new Font("黑体", Font.PLAIN, 14));

        /*------设置X轴的标题文字------------*/
        domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 16));

        /*------设置Y轴坐标上的文字-----------*/
        numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 14));

        /*------设置Y轴的标题文字------------*/
        numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 16));

        /*------这句代码解决了底部汉字乱码的问题-----------*/
        //chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));

        /*******这句代码解决了标题汉字乱码的问题********/
        chart.getTitle().setFont(new Font("宋体", Font.PLAIN, 16));

        FileOutputStream out = null;
        try {
            out = new FileOutputStream(filePath);
            ChartUtilities.writeChartAsJPEG(out, 0.5f, chart, 800, 500, null);
        } finally {
            try {
                out.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
	}
	
}
